package com.wgy.day32字符流.字符输入流;

import java.io.FileReader;
import java.io.IOException;

/*
字符流:当使用字节流读取文本文件时,可能会有一个小问题,就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用对个字节存储,
      所以java提供一些字符流,已字符为单位读写数据,专门用于处理文本文件
分类:字符输入流和字符输出流:
java.io.Reader: 抽象类,表示用于读取字符流的所有类的超类,可以读取字符信息到内存中,
                定义了字符输入流的基本共性功能方法
    共性的成员方法:public void close():关闭此流并释放与此流相关的任何系统资源
                public int read(): 从输入流读取一个字符,(读取单个字符并返回)
                public int read(char[] cbuf):从输入流读取一些字符,并将它们存储到字符数组cbuf中(一次读取多个字符,并将读取到的字符存储到cbuf数组中)



java.io.FileReader extends InputStreamReader  extends Reader
FileReader:文件字符输入流
       作用:把硬盘文件中的数据以字符的方式读取到内存中
    构造方法:  FileReader (String fileName):
              FileReader (File file):
              参数:读取文件的数据源
                   String fileName:文件的路径
                         File file:文件
 构造方法的作用: 1.创建一个FileReader对象
              2.会把FileReader对象指向要读取的文件

字符输入流的使用步骤:1.创建FileReader对象,构造方法中绑定要读取的数据源
                 2.使用FileReader对象中的方法read读取文件
                 3.释放资源

String 类的构造方法
 String(char[] value):把字符数组转换为字符串
 String(char[] value,int offset,int count):把字符数组的一部分转换为字符串
                                 int offset:数组的开始索引
                                 int count:转换的个数
*/
public class Demo01Reader {
    public static void main(String[] args) throws IOException {
        show02();
    }

    public static void show01() throws IOException {
        //1.创建FileReader对象,构造方法中绑定要读取的数据源
        FileReader fr = new FileReader("D:\\小云\\abc\\b\\b.txt");

        // 2.使用FileReader对象中的方法read读取文件
/*         int len = fr.read();
           System.out.println(len);//97
 */
        // int read(): 读取单个字符并返回
        int len = 0;
        while ((len = fr.read()) != -1) {
            System.out.print((char) len);
        }
        // 3.释放资源
        fr.close();
    }

    public static void show02() throws IOException {
        //1.创建FileReader对象,构造方法中绑定要读取的数据源
        FileReader fr=new FileReader("D:\\小云\\abc\\b\\b.txt");
        //2.使用FileReader对象中的方法read(char[] cbuf):读取文件
        char[] chars=new char[1024];//存储到读取的多个字符
        int len = 0;//记录每次读取到的有效的字符个数
        while ((len=fr.read(chars))!=-1){
/*       String 类的构造方法
         String(char[] value):把字符数组转换为字符串
         String(char[] value,int offset,int count):把字符数组的一部分转换为字符串
                                        int offset:数组的开始索引
                                         int count:转换的个数
 */
            System.out.println(new String(chars,0,len));
        }
        // 3.释放资源
        fr.close();
    }
 }
